home *** CD-ROM | disk | FTP | other *** search
- ;*---------------------------------------------------------------------------
- ; :Program. Reloc.asm
- ; :Contents. relocate exe to absolut address
- ; :Author. Bert Jahn
- ; :EMail. wepl@kagi.com
- ; :Address. Franz-Liszt-Straße 16, Rudolstadt, 07404, Germany
- ; :Version. $Id: Reloc.asm 0.6 1999/01/17 14:18:50 jah Exp jah $
- ; :History. 11.06.96
- ; 20.06.96 minor
- ; 11.08.96 BUG register d2 not saved in _AdrHunk and _OffHunk
- ; BUG MemoryFlags was not maked out from Hunk-ID's
- ; 25.08.96 argument ADR/K uses now _etoi (allows hexadecimal input)
- ; 17.01.99 recompile because error.i changed
- ; :Requires. OS V37+
- ; :Copyright. © 1996,1997,1998 Bert Jahn, All Rights Reserved
- ; :Language. 68000 Assembler
- ; :Translator. Barfly V1.131
- ;---------------------------------------------------------------------------*
- ;##########################################################################
-
- INCDIR Includes:
- INCLUDE lvo/exec.i
- INCLUDE exec/memory.i
- INCLUDE lvo/dos.i
- INCLUDE dos/dos.i
- INCLUDE dos/doshunks.i
-
- INCLUDE macros/ntypes.i
-
- ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- GL EQUR A4 ;a4 ptr to Globals
- LOC EQUR A5 ;a5 for local vars
-
- STRUCTURE ArgArray,0
- ULONG aa_input
- ULONG aa_output
- ULONG aa_adr
- ULONG aa_quiet
- LABEL aa_SIZEOF
-
- NSTRUCTURE Globals,0
- NAPTR gl_execbase
- NAPTR gl_dosbase
- NAPTR gl_rdargs
- NSTRUCT gl_rdarray,aa_SIZEOF
- NLONG gl_rc
- NALIGNLONG
- NLABEL gl_SIZEOF
-
- DEFAULT_ADR = $400
-
- ;##########################################################################
-
- Version = 0
- Revision = 6
-
- PURE
- OUTPUT C:Reloc
-
- IFND .passchk
- DOSCMD "WDate >T:date"
- .passchk
- ENDC
-
- VER MACRO
- sprintx "Reloc %ld.%ld ",Version,Revision
- INCBIN "T:date"
- ENDM
-
- bra .start
- dc.b 0,"$VER: "
- VER
- dc.b 0
- EVEN
- .start
-
- ;##########################################################################
-
- link GL,#gl_SIZEOF
- move.l (4).w,(gl_execbase,GL)
- clr.l (gl_rdarray+aa_output,GL)
- clr.l (gl_rdarray+aa_adr,GL)
- move.l #20,(gl_rc,GL)
- clr.l (gl_rdarray+aa_quiet,GL)
-
- move.l #37,d0
- lea (_dosname),a1
- move.l (gl_execbase,GL),a6
- jsr _LVOOpenLibrary(a6)
- move.l d0,(gl_dosbase,GL)
- beq .nodoslib
-
- lea (_template),a0
- move.l a0,d1
- lea (gl_rdarray,GL),a0
- move.l a0,d2
- moveq #0,d3
- move.l (gl_dosbase,GL),a6
- jsr (_LVOReadArgs,a6)
- move.l d0,(gl_rdargs,GL)
- bne .argsok
- lea (_readargs),a0
- bsr _PrintErrorDOS
- bra .noargs
- .argsok
- tst.l (gl_rdarray+aa_output,GL)
- bne .1
- move.l (gl_rdarray+aa_input,GL),(gl_rdarray+aa_output,GL)
- .1
- move.l #DEFAULT_ADR,d0
- move.l (gl_rdarray+aa_adr,GL),d1
- beq .set_adr
- move.l d1,a0
- bsr _etoi
- tst.b (a0) ;end of string reached ?
- beq .set_adr
- moveq #ERROR_BAD_NUMBER,d1 ;otherwise error
- moveq #0,d2
- move.l (gl_dosbase,GL),a6
- jsr (_LVOPrintFault,a6)
- bra .badargs
- .set_adr move.l d0,(gl_rdarray+aa_adr,GL)
-
- tst.l (gl_rdarray+aa_quiet,GL)
- bne .quiet
- lea (_ver),a0
- bsr _Print
- .quiet
-
- bsr _Main
-
- .badargs
- move.l (gl_rdargs,GL),d1
- move.l (gl_dosbase,GL),a6
- jsr (_LVOFreeArgs,a6)
- .noargs
- move.l (gl_dosbase,GL),a1
- move.l (gl_execbase,GL),a6
- jsr (_LVOCloseLibrary,a6)
- .nodoslib
- move.l (gl_rc,GL),d0
- unlk GL
- rts
-
- ;##########################################################################
-
- NSTRUCTURE local_main,0
- NAPTR lm_srcptr
- NULONG lm_srcsize
- NULONG lm_destsize
- NULONG lm_destptr
- NLABEL lm_SIZEOF
-
- _Main movem.l d2/a2/a6,-(a7)
- link LOC,#lm_SIZEOF
- clr.l (lm_destptr,LOC)
-
- move.l (gl_rdarray+aa_input,GL),a0
- pea .r1
- tst.l (gl_rdarray+aa_quiet,GL)
- beq _LoadFileMsg
- bra _LoadFile
- .r1 move.l d1,(lm_srcsize,LOC)
- move.l d0,(lm_srcptr,LOC)
- beq .nosource
-
- chka0 MACRO
- cmp.l a0,a1
- bls .corruptexe
- ENDM
-
- move.l (lm_srcptr,LOC),a0
- move.l a0,a1
- add.l (lm_srcsize,LOC),a1 ;A1 = end of buffer
- chka0
- cmp.l #HUNK_HEADER,(a0)+
- beq .1
- lea (_badexe),a0
- bsr _Print
- bra .freesource
- .1
- .nextname chka0
- move.l (a0)+,d0
- beq .noname
- add.l d0,d0
- add.l d0,d0
- bmi .corruptexe
- add.l d0,a0
- bra .nextname
- .noname chka0
- move.l (a0)+,d7 ;d7 = Anzahl der Hunks
- addq.l #8,a0 ;lowhunk + highhunk
- move.l a0,a3 ;A3 = STRUCT hunksize's
- move.l d7,d0
- moveq #0,d1
- .a chka0
- move.l (a0)+,d2
- and.l #$00ffffff,d2
- lsl.l #2,d2
- add.l d2,d1
- subq.l #1,d0
- bne .a
- move.l d1,(lm_destsize,LOC)
-
- move.l d1,d0
- move.l #MEMF_CLEAR,d1
- move.l (gl_execbase,GL),a6
- jsr (_LVOAllocVec,a6)
- move.l d0,(lm_destptr,LOC)
- bne .g
- lea (_nomem),a0
- bsr _Print
- bra .freesource
- .g
-
- move.l a3,a0
- add.l d7,a0
- add.l d7,a0
- add.l d7,a0
- add.l d7,a0 ;A0 = source
- move.l (lm_srcptr,LOC),a1
- add.l (lm_srcsize,LOC),a1 ;A1 = end of buffer
- moveq #0,d6 ;D6 = actual hunk
-
- .nexthunk chka0
- move.l (a0)+,d0
- and.l #$00ffffff,d0 ;mask MemoryFlags
- cmp.l #HUNK_NAME,d0 ;name
- beq .addlws
- cmp.l #HUNK_CODE,d0 ;code
- beq .code
- cmp.l #HUNK_DATA,d0 ;data
- beq .data
- cmp.l #HUNK_BSS,d0 ;bss
- bne .n1
- addq.l #4,a0
- bra .nexthunk
- .n1 cmp.l #HUNK_RELOC32,d0 ;reloc32
- beq .relocs
- cmp.l #HUNK_RELOC16,d0 ;reloc16
- beq .relocs
- cmp.l #HUNK_RELOC8,d0 ;reloc8
- beq .relocs
- cmp.l #HUNK_EXT,d0 ;ext
- beq .symboldata
- cmp.l #HUNK_SYMBOL,d0 ;symbol
- beq .symboldata
- cmp.l #HUNK_DEBUG,d0 ;debug
- beq .addlws
- cmp.l #HUNK_END,d0 ;end
- bne .badhunk
-
- addq.l #1,d6
- cmp.l d6,d7 ;last hunk ?
- beq .endfind
- bra .nexthunk
-
- .code
- .data chka0
- move.l d6,d0
- bsr _AdrHunk
- move.l a1,a2
- move.l d0,a1
- move.l (a0)+,d0
- lsl.l #2,d0
- move.l d0,d2
- bsr _Copy
- beq .corruptexe
- move.l a2,a1
- add.l d2,a0
- bra .nexthunk
-
- .addlws chka0
- move.l (a0)+,d0
- add.l d0,d0
- add.l d0,d0
- bmi .corruptexe
- add.l d0,a0
- bra .nexthunk
-
- .relocs chka0
- move.l (a0)+,d2 ;Anzahl der relocs
- beq .nexthunk
- chka0
- move.l (a0)+,d0 ;hunk auf den sich relocs beziehen
- bsr _OffHunk
- move.l d0,d1 ;d1 = address
- move.l d6,d0
- bsr _AdrHunk
- move.l d0,a2
- .n chka0
- move.l (a0)+,d0
- add.l d1,(a2,d0.l)
- sub.l #1,d2
- bne .n
- bra .relocs
-
- .symboldata chka0
- move.l (a0),d0
- beq .nexthunk
- and.l #$00ffffff,d0
- add.l d0,d0
- add.l d0,d0
- bmi .corruptexe
- add.l d0,a0
- move.l (a0)+,d0
- rol.l #8,d0
- cmp.b #1,d0
- beq .1lw
- cmp.b #2,d0
- beq .1lw
- cmp.b #3,d0
- beq .1lw
- cmp.b #129,d0
- beq .morelw
- cmp.b #130,d0
- beq .more1lw
- cmp.b #131,d0
- beq .morelw
- cmp.b #132,d0
- beq .morelw
- bra .badsym
-
- .1lw addq.l #4,a0
- bra .symboldata
- .more1lw addq.l #4,a0
- .morelw chka0
- move.l (a0)+,d0
- add.l d0,d0
- add.l d0,d0
- bmi .corruptexe
- add.l d0,a0
- bra .symboldata
-
- .endfind
- tst.l (gl_rdarray+aa_quiet,GL)
- bne .quiet
- lea (_ok),a0
- move.l (gl_rdarray+aa_adr,GL),-(a7)
- move.l a7,a1
- bsr _PrintArgs
- addq.l #4,a7
- .quiet
- move.l (lm_destsize,LOC),d0
- move.l (lm_destptr,LOC),a0
- move.l (gl_rdarray+aa_output,GL),a1
- pea .r2
- tst.l (gl_rdarray+aa_quiet,GL)
- beq _SaveFileMsg
- bra _SaveFile
- .r2 tst.l d0
- beq .freedest
- clr.l (gl_rc,GL)
- bra .freedest
-
- .badsym lea (_badsym),a0
- bsr _Print
- bra .freedest
-
- .badhunk lea (_badhunk),a0
- bsr _Print
- bra .freedest
-
- .corruptexe lea (_corruptexe),a0
- bsr _Print
-
- .freedest
- move.l (lm_destptr,LOC),d0
- beq .afterfreedest
- move.l d0,a1
- move.l (gl_execbase,GL),a6
- jsr (_LVOFreeVec,a6)
- .afterfreedest
- .freesource
- move.l (lm_srcptr,LOC),a1
- move.l (gl_execbase,GL),a6
- jsr (_LVOFreeVec,a6)
- .nosource
- unlk LOC
- movem.l (a7)+,d2/a2/a6
- rts
-
- ; IN: d0=size a0=src a1=dest
- ; OUT: d0=success
-
- _Copy movem.l d1/a0-a2/a6,-(a7)
-
- move.l (lm_srcptr,LOC),d1
- cmp.l d1,a0 ;check A0
- blo .shit
- add.l (lm_srcsize,LOC),d1
- lea (a0,d0.l),a2
- cmp.l d1,a2 ;check A0+D0
- bhi .shit
-
- move.l (lm_destptr,LOC),d1
- cmp.l d1,a1 ;check A1
- blo .shit
- add.l (lm_destsize,LOC),d1
- lea (a1,d0.l),a2
- cmp.l d1,a2 ;check A1+D0
- bhi .shit
-
- move.l (gl_execbase,GL),a6
- jsr (_LVOCopyMemQuick,a6)
- moveq #-1,d0
- bra .q
-
- .shit moveq #0,d0
- .q movem.l (a7)+,d1/a0-a2/a6
- tst.l d0
- rts
-
- ; get start of hunk im mem
- ; IN: d0=hunknumber
- ; OUT: d0=address
-
- _AdrHunk movem.l d1-d2/a0,-(a7)
-
- move.l d0,d1
- move.l (lm_destptr,LOC),d0
- move.l a3,a0
- bra .i
-
- .a move.l (a0)+,d2
- lsl.l #8,d2 ;remove memory flags
- lsr.l #6,d2 ;multiply by 4 (LongWords)
- add.l d2,d0 ;increase memory pointer
- subq.l #1,d1
- .i tst.l d1
- bne .a
-
- movem.l (a7)+,d1-d2/a0
- rts
-
- ; get offset of hunk
- ; IN: d0=hunknumber
- ; OUT: d0=address
-
- _OffHunk movem.l d1-d2/a0,-(a7)
-
- move.l d0,d1
- move.l (gl_rdarray+aa_adr,GL),d0
- move.l a3,a0
- bra .i
-
- .a move.l (a0)+,d2
- lsl.l #8,d2
- lsr.l #6,d2
- add.l d2,d0
- subq.l #1,d1
- .i tst.l d1
- bne .a
-
- movem.l (a7)+,d1-d2/a0
- rts
-
- ;##########################################################################
-
- INCDIR Sources:
- INCLUDE dosio.i
- PrintLn
- PrintArgs
- Print
- INCLUDE error.i
- PrintError
- PrintErrorDOS
- INCLUDE files.i
- GetFileName
- LoadFile
- LoadFileMsg
- SaveFile
- SaveFileMsg
- INCLUDE strings.i
- etoi
-
- ;##########################################################################
-
- _ok dc.b "file has been relocated to address $%lx",10,0
-
- _badexe dc.b "not executable",10,0
- _corruptexe dc.b "executable is corrupt",10,0
- _badhunk dc.b "unknown hunk",10,0
- _badsym dc.b "unknown symbol",10,0
- _nomem dc.b "not enough free store",0
-
- ; Operationen
- _readargs dc.b "read arguments",0
- _getfilemem dc.b "alloc mem for file",0
- _allocdestmem dc.b "alloc temp dest mem",0
- _openfile dc.b "open file",0
- _getfilesize dc.b "get size of file",0
- _readfile dc.b "read file",0
- _writefile dc.b "write file",0
-
- ;subsystems
- _dosname dc.b "dos.library",0
-
- _template dc.b "INPUTFILE/A" ;name eines zu ladenden Files
- dc.b ",OUTPUTFILE" ;savefile name
- dc.b ",ADR/K" ;to relocate
- dc.b ",QUIET/S"
- dc.b 0
-
- _ver VER
- dc.b 10,0
-
- ;##########################################################################
-
- END
-
-